home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / svgapc23 / svgademo.c < prev    next >
C/C++ Source or Header  |  1995-04-30  |  15KB  |  617 lines

  1. /****************************************************************************
  2.      
  3.       'SVGACC' A Super Vga Graphics Library for use with Microsoft compatible
  4.       C/C++ compilers
  5.       Copyright 1993-1995 by Stephen L. Balkum and Daniel A. Sill
  6.  
  7.     **************** UNREGISTERD SHAREWARE VERSION ***********************
  8.     * FOR EVUALATION ONLY. NOT FOR RESALE IN ANY FORM. SOFTWARE WRITTEN  *
  9.     * USING THIS UNREGISTERED SHAREWARE GRAPHICS LIBRARY MAY NOT BY SOLD *
  10.     * OR USED FOR ANY PURPOSE OTHER THAN THE EVUALTION OF THIS LIBRARY.  *
  11.     **********************************************************************
  12.  
  13.     **************** NO WARRANTIES AND NO LIABILITY **********************
  14.     * Stephen L. Balkum and Daniel A. Sill provide no warranties, either *
  15.     * expressed or implied, of merchantability, or fitness, for a        *
  16.     * particular use or purpose of this SOFTWARE and documentation.      *
  17.     * In no event shall Stephen L. Balkum or Daniel A. Sill be held      *
  18.     * liable for any damages resulting from the use or misuse of the     * 
  19.     * SOFTWARE and documentation.                                        *
  20.     **********************************************************************
  21.  
  22.     ************** U.S. GOVERNMENT RESTRICTED RIGHTS *********************
  23.     * Use, duplication, or disclosure of the SOFTWARE and documentation  *
  24.     * by the U.S. Government is subject to the restictions as set forth  *
  25.     * in subparagraph (c)(1)(ii) of the Rights in Technical Data and     *
  26.     * Computer Software cluse at DFARS 252.227-7013.                     *
  27.     * Contractor/manufacturer is Stephen L. Balkum and Daniel A. Sill,   *
  28.     * P.O. Box 7704, Austin, Texas 78713-7704                            *
  29.     **********************************************************************
  30.  
  31.     **********************************************************************
  32.     * By using this SOFTWARE or documentation, you agree to the above    *
  33.     * terms and conditions.                                              *
  34.     **********************************************************************
  35.  
  36.  ***************************************************************************/
  37.     
  38.  
  39. #include <stdio.h>
  40. #include <conio.h>
  41. #include <stdlib.h>
  42. #include <string.h>
  43. #include <math.h>
  44. #include <dos.h>
  45.  
  46. #include "svgacc.h"
  47.  
  48. #include "svgademo.h"
  49.  
  50.  
  51. void main(void) {
  52.  
  53.     int startvideomode;
  54.     int i, max, ky;
  55.     int mjv, mnv, tp;
  56.     int cpu, videomemory;
  57.     int mouse, joystick;
  58.     int res;
  59.     int offset, colr;
  60.     float mypi;
  61.     char dummy;
  62.     char buf[TITLEN];
  63.     char *dumptr;
  64.     
  65.     
  66.     /*
  67.      * Save the starting videomode and set it to mode 3.
  68.      */
  69.     startvideomode = videomodeget();
  70.     restext();
  71.     screenclear();
  72.     
  73.     /*
  74.      * Move the DOS cursor to the top left to start the program and say hello
  75.      */
  76.     screengoto(11,0);
  77. #ifdef __POWERC
  78.     printf("/*SVGAPC.LIB/* A SuperVGA Graphics Library for use with\n");
  79. #else
  80.     printf("/*SVGACC.LIB/* A SuperVGA Graphics Library for use with\n");
  81. #endif
  82.     screengoto(23,1);
  83. #ifdef __POWERC
  84.     printf("Mix Software's Power C\n");
  85. #else
  86.     printf("Microsoft compatible C/C++ compilers\n");
  87. #endif
  88.     screengoto(9,2);
  89.     printf("Copyright 1993-1995 by Stephen L. Balkum and Daniel A. Sill\n");
  90.     screengoto(23,11);
  91.     printf("Demonstration/Example Program\n");
  92.     screengoto(0,22);
  93.     printf("press a key to begin the demo...\n");
  94.     demogetkey();
  95.  
  96.     screenclear();
  97.    
  98.     /*
  99.      * Let's id the processor first as the library requires a 386 or better.
  100.      */
  101.     screengoto(0,0);
  102.     cpu = whichcpu();
  103.     if (cpu < 386) {
  104.         printf("Sorry, this library requires an 80386 or better processor.\n");
  105.         printf("Processor is identified as an 80%d.\n", cpu);
  106.         printf("Demo program will be terminated.\n\n");
  107.         printf("press a key...\n");
  108.         demogetkey();
  109.         videomodeset(startvideomode);
  110.         exit(0);
  111.     }
  112.  
  113.  
  114.     /*
  115.      * Let's id the video card/chip as the library requires a SuperVGA adapter.
  116.      */
  117.     switch(whichvga()) {
  118.         case ACUMOS:
  119.             sprintf(buf,"Acumos AVGA2/3 SuperVGA");
  120.             break;
  121.         case ATI:
  122.             sprintf(buf,"ATI Technologies 18/28/38/68800 SuperVGA");
  123.             break;
  124.         case AHEADA:
  125.             sprintf(buf,"Ahead V5000 Ver A SuperVGA");
  126.             break;
  127.         case AHEADB:
  128.             sprintf(buf,"Ahead V5000 Ver B SuperVGA");
  129.             break;
  130.         case CHIPSTECH:
  131.             sprintf(buf,"Chips and Technologies 82C450/1/2/3/5/6/7 SuperVGA");
  132.             break;
  133.         case CIRRUS:
  134.             sprintf(buf,"Cirrus Logic CL-GD 5xx,6xx,28xx,54xx,62xx SuperVGA");
  135.             break;
  136.         case EVEREX:
  137.             sprintf(buf,"Everex EV236/6xx Micro Enhancer SuperVGA");
  138.             break;
  139.         case GENOA:
  140.             sprintf(buf,"Genoa 61/62/63/64/6600 SuperVGA");
  141.             break;
  142.         case NCR:
  143.             sprintf(buf,"NCR 77C21/22/22E/22E+ SuperVGA");
  144.             break;
  145.         case OAKTECH:
  146.             sprintf(buf,"Oak Technologies OTI-037/67/77/87C SuperVGA");
  147.             break;
  148.         case PARADISE:
  149.             sprintf(buf,"Paradise/Western Digital PVGA1A,WD90C00/1x/2x/3x SuperVGA");
  150.             break;
  151.         case REALTEK:
  152.             sprintf(buf,"Realtek RT3106 SuperVGA");
  153.             break;
  154.         case TRIDENT:
  155.             sprintf(buf,"Trident 8800CS,8900B/C/CL/CX,90x0 SuperVGA");
  156.             break;
  157.         case TSENG3:
  158.             sprintf(buf,"Tseng Labs ET3000-AX/BX/BP SuperVGA");
  159.             break;
  160.         case TSENG4:
  161.             sprintf(buf,"Tseng Labs ET4000/W32/W32I SuperVGA");
  162.             break;
  163.         case VESA:
  164.             sprintf(buf,"VESA compatible SuperVGA");
  165.             break;
  166.         case VIDEO7:
  167.             sprintf(buf,"Video 7 HT-208/16 SuperVGA");
  168.             break;
  169.         case AVANCE:
  170.             sprintf(buf,"Avance Logic AL2101 SuperVGA");
  171.             break;
  172.         case MXIC:
  173.             sprintf(buf,"MXIC MX68000/10 SuperVGA");
  174.             break;
  175.         case PRIMUS:
  176.             sprintf(buf,"Primus P2000 SuperVGA");
  177.             break;
  178.         default:
  179.             printf("Microprocessor is identified as an 80%d.\n", cpu);
  180.             printf("Sorry, unable to identify video card or it is not a SuperVGA video adapter.\n");
  181.             printf("Demo program will be terminated.\n\n");
  182.             printf("press a key...\n");
  183.             demogetkey();
  184.             videomodeset(startvideomode);
  185.             exit(0);
  186.     }
  187.     printf("Microprocessor is identified as an 80%d.\n", cpu);
  188.     
  189.     fontsystem();
  190.     printf("Video card/chip is identified as %s.\n",&buf);
  191.    
  192.     /*
  193.      * Let's see the how much memory is installed on the super vga adapter.
  194.      */
  195.     videomemory = whichmem();
  196.     if (videomemory < 1) {
  197.         printf("Sorry, unable to identify the amount of installed video memory.\n");
  198.         printf("Demo program will be terminated.\n\n");
  199.         printf("press a key...\n");
  200.         demogetkey();
  201.         videomodeset(startvideomode);
  202.         exit(0);
  203.     } else
  204.         printf("Installed video memory identified as %dkb.\n", videomemory);
  205.        
  206.     /*
  207.      * Let's tell the user what the highest resolution that the video card
  208.      * and its installed memory card is capable of. The monitor must be able
  209.      * to support those modes too !
  210.      */
  211.     printf("Video card and installed memory is capable of the following resolutions:\n");
  212.     if (videomemory > 2047) {
  213.         printf("    320x200 in 256 colors\n");
  214.         printf("    640x400 in 256 colors\n");
  215.         printf("    640x480 in 256 colors\n");
  216.         printf("    800x600 in 256 colors\n");
  217.         printf("    1024x768 in 256 colors\n");
  218.         printf("    1280x1024 in 256 colors\n");
  219.         max = 5;
  220.     } else if (videomemory > 1023) {
  221.         printf("    320x200 in 256 colors\n");
  222.         printf("    640x400 in 256 colors\n");
  223.         printf("    640x480 in 256 colors\n");
  224.         printf("    800x600 in 256 colors\n");
  225.         printf("    1024x768 in 256 colors\n");
  226.         max = 4;
  227.     } else if (videomemory > 511) {
  228.         printf("    320x200 in 256 colors\n");
  229.         printf("    640x400 in 256 colors\n");
  230.         printf("    640x480 in 256 colors\n");
  231.         printf("    800x600 in 256 colors\n");
  232.         max = 3;
  233.     } else {
  234.         printf("    320x200 in 256 colors\n");
  235.         printf("    640x400 in 256 colors\n");
  236.         max = 1;
  237.     }
  238.     printf("\nPlease keep in mind that not all monitors support all resolutions. If You\n");
  239.     printf("know your monitor will not work properly at very high resolution(ie 1024x768\n");
  240.     printf("or 1280x1024) then do NOT attempt to run the demo in that resolution.\n\n");
  241.  
  242.     /*
  243.      * Let's look for a mouse. if we find one, tell all about it
  244.      */
  245.     mouse = whichmouse();
  246.     if (mouse > 0) {
  247.         mouseinfo(&mjv, &mnv, &tp, &i);
  248.         switch (tp) {
  249.             case 1:
  250.                 sprintf(buf,"bus mouse");
  251.                 break;
  252.             case 2:
  253.                 sprintf(buf,"serial mouse");
  254.                 break;
  255.             case 3:
  256.                 sprintf(buf,"Inport mouse");
  257.                 break;
  258.             case 4:
  259.                 sprintf(buf,"PS/2 mouuse");
  260.                 break;
  261.             case 5:
  262.                 sprintf(buf,"HP mouse");
  263.                 break;
  264.             default:
  265.                 sprintf(buf,"unknown type");
  266.         }
  267.         printf("Microsoft compatible %s detected with %d buttons on IRQ %d.\n", &buf, mouse, i);
  268.         printf("Software driver version is %d.%d (Microsoft equivalent version).\n\n", mjv, mnv);
  269.  
  270.     } else
  271.         printf("No Microsoft compatible mouse detected.\n\n");
  272.  
  273.     /*
  274.      * Let's look for joysticks
  275.      */
  276.     joystick = whichjoystick();
  277.     switch (joystick) {
  278.         case -1:
  279.             printf("No joystick port detected or no joystick BIOS support present.\n\n");
  280.             break;
  281.         case 0:
  282.             printf("No joystick detected\n\n");
  283.             break;
  284.         case 1:
  285.             printf("Joystick A is present and available.\n\n");
  286.             break;
  287.         case 2:
  288.             printf("Joystick B is present and available.\n\n");
  289.             break;
  290.         case 3:
  291.             printf("Both Joystick A and Joystick B are present and available.\n\n");
  292.             break;
  293.     }
  294.     printf("press a key...\n");
  295.     demogetkey();
  296.  
  297.  
  298.     /*
  299.      * Let's get down to business
  300.      */
  301.     res = 1;
  302.     endit = 0;
  303.     ky=0;
  304.     
  305.     /*
  306.      * Init alternate color palettes
  307.      */
  308.  
  309.     res320();
  310.     palget(orgpal, 0, 255);
  311.     palcopy(orgpal,pal,0,255);
  312.     palcopy(orgpal,pal2,0,255);
  313.     mypi=(float)(8 * atan(1) / 240);
  314.     offset = 16;
  315.     for (colr=0;colr<240;colr++,offset++) {
  316.         pal[offset].r = (char)(32.0 + sin((colr + 0) * mypi) * 31.0);
  317.         pal[offset].g = (char)(32.0 + sin((colr + 80) * mypi) * 31.0);
  318.         pal[offset].b = (char)(32.0 + sin((colr + 160) * mypi) * 31.0);
  319.         pal2[offset].r = (char)(32.0 + sin((colr + 10) * mypi) * 31.0);
  320.         pal2[offset].g = (char)(32.0 + sin((colr + 30) * mypi) * 31.0);
  321.         pal2[offset].b = (char)(32.0 + sin((colr + 50) * mypi) * 31.0);
  322.     }
  323.     restext();
  324.  
  325.     /*
  326.      * Here is the main selector loop
  327.      */
  328.     while (endit == 0) {
  329.         screenclear();
  330.         switch (res) {
  331.             case 1: 
  332.                 sprintf(buf,"320x200x256");
  333.                 break;
  334.             case 2:
  335.                 sprintf(buf,"640x400x256");
  336.                 break;
  337.             case 3:
  338.                 sprintf(buf,"640x480x256");
  339.                 break;
  340.             case 4:
  341.                 sprintf(buf,"800x600x256");
  342.                 break;
  343.             case 5:
  344.                 sprintf(buf,"1024x768x256");
  345.             case 6:
  346.                 sprintf(buf,"1280x1024x256");
  347.         }
  348.         printf("Please select the demo you would like to see in the %s resolution:\n\n",&buf);
  349.         printf("(0)  Exit This Program\n\n");
  350.         printf("(1)  Demo #1  The Primitive Drawing Routines\n");
  351.         printf("(2)  Demo #2  The Clipping Capabilities\n");
  352.         printf("(3)  Demo #3  The Fill Routines\n");
  353.         printf("(4)  Demo #4  The Palette Routines\n");
  354.         printf("(5)  Demo #5  The Block Routines\n");
  355.         printf("(6)  Demo #6  The Text Routines\n");
  356.         printf("(7)  Demo #7  The Scrolling and Paging Routines\n");
  357.         printf("(8)  Demo #8  The PCX Routines\n");
  358.         printf("(9)  Demo #9  The Mouse Routines\n");
  359.         printf("(10) Demo #10 The Joystick Routines\n");
  360.         printf("(11) Demo #11 The Two Dimensional Routines\n");
  361.         printf("(12) Demo #12 The Three Dimensional Routines\n");
  362.         printf("(13) The Grand Tour of All Demos\n");
  363.         printf("(14) Use 320x200 in 256 colors\n");
  364.         printf("(15) Use 640x400 in 256 colors\n");
  365.         max = 15;
  366.         if (videomemory > 511) {
  367.             printf("(16) Use 640x480 in 256 colors\n");
  368.             printf("(17) Use 800x600 in 256 colors\n");
  369.             max = 17;
  370.         } 
  371.         if (videomemory > 1023) {
  372.             printf("(18) Use 1024x768 in 256 colors\n");
  373.             max = 18;
  374.         }
  375.         if (videomemory > 2047) {
  376.             printf("(19) Use 1280x1024 in 256 colors\n");
  377.             max = 19;
  378.         }
  379.  
  380.         printf("\nYour Choice: ");
  381.         for (i=0;i<3;i++) {
  382.             dummy = (char)getch();
  383.             switch (dummy) {
  384.                 case 13:
  385.                     if (i == 0)
  386.                         i--;
  387.                     else {
  388.                         buf[i]='\0';
  389.                         i=2;
  390.                     }
  391.                     break;
  392.                 case 8:
  393.                     i--;
  394.                     if (i > (-1)) {
  395.                         printf("\b \b");
  396.                         i--;
  397.                     }
  398.                     break;
  399.                 default:
  400.                     if ((dummy < '0') || (dummy > '9'))
  401.                         i--;
  402.                     else if (i < 2) {
  403.                         printf("%c",dummy);
  404.                         buf[i] = dummy;
  405.                     } else
  406.                         buf[i] = '\0';
  407.  
  408.             }
  409.         }
  410.         ky=(int)strtol(buf,&dumptr,10);
  411.  
  412.         if (ky > max)
  413.             ky = 99;
  414.     
  415.         if((ky > 0) && (ky < 14))
  416.             switch (res) {
  417.                 case 1:
  418.                     res320();
  419.                     break;
  420.                 case 2:
  421.                     res640l();
  422.                     break;
  423.                 case 3:
  424.                     res640();
  425.                     break;
  426.                 case 4:
  427.                     res800();
  428.                     break;
  429.                 case 5:
  430.                     res1024();
  431.                     break;
  432.                 case 6:
  433.                     res1280();
  434.                     break;
  435.             }
  436.         
  437.         switch (ky) {
  438.             case 0:
  439.                 endit = 1;
  440.                 break;
  441.             case 1:
  442.                 doprims();
  443.                 break;
  444.             case 2:
  445.                 doclip();
  446.                 break;
  447.             case 3:
  448.                 dofill();
  449.                 break;
  450.             case 4:
  451.                 dopal();
  452.                 break;
  453.             case 5:
  454.                 doblock();
  455.                 break;
  456.             case 6:
  457.                 dotext();
  458.                 break;
  459.             case 7:
  460.                 doscroll();
  461.                 break;
  462.             case 8:
  463.                 dopcx();
  464.                 break;
  465.             case 9:
  466.                 domouse();
  467.                 break;
  468.             case 10:
  469.                 dojoystick();
  470.                 break;
  471.             case 11:
  472.                 do2d();
  473.                 break;
  474.             case 12:
  475.                 do3d();
  476.                 break;
  477.             case 13:
  478.                 doall();
  479.                 break;
  480.             case 14:
  481.                 res = 1;
  482.                 break;
  483.             case 15:
  484.                 res = 2;
  485.                 break;
  486.             case 16:
  487.                 res = 3;
  488.                 break;
  489.             case 17:
  490.                 res = 4;
  491.                 break;
  492.             case 18:
  493.                 res = 5;
  494.                 break;
  495.             default:
  496.                 ;
  497.  
  498.         }
  499.         
  500.         restext();
  501.         
  502.     }
  503.  
  504.     videomodeset(startvideomode);
  505.  
  506. }
  507.  
  508. /**************               
  509.  * DEMOGETKEY *
  510.  **************/
  511.  
  512. char demogetkey(void)
  513. {
  514.     char ret;
  515.     beep();
  516.     ret = (char)getch();
  517.     if ( (ret == 'Q') || (ret == 'q') )
  518.         endit = 1;
  519.     if (ret == 'Q')
  520.         ret = 'q';
  521.     if (ret == 'S')
  522.         ret = 's';
  523.     
  524.     return(ret);
  525. }
  526.  
  527.  
  528. /*********
  529.  * DOALL *
  530.  *********/
  531.  
  532. void doall(void)
  533. {
  534.     if(doprims()=='q')
  535.         return;
  536.     if(doclip()=='q')
  537.         return;
  538.     if(dofill()=='q')
  539.         return;
  540.     if(dopal()=='q')
  541.         return;
  542.     if(doblock()=='q')
  543.         return;
  544.     if(dotext()=='q')
  545.         return;
  546.     if(doscroll()=='q')
  547.         return;
  548.     if(dopcx()=='q')
  549.         return;
  550.     if(domouse()=='q')
  551.         return;
  552.     if(dojoystick()=='q')
  553.         return;
  554.     if(do2d()=='q')
  555.         return;
  556.     if(do3d()=='q')
  557.         return;
  558.  
  559.     return;
  560.  
  561. }
  562.  
  563.  
  564. /***************
  565.  * SCREENCLEAR *
  566.  ***************/
  567.  
  568. void screenclear(void)
  569. {
  570.     union REGS regs;
  571.  
  572.     regs.h.ah = 0x07;
  573.     regs.h.al = 0x00;
  574.     regs.h.ch = 0;
  575.     regs.h.cl = 0;
  576.     regs.h.dh = 24;
  577.     regs.h.dl = 79;
  578.     regs.h.bh = 7;
  579.     int86(0x10, ®s, ®s);
  580.     screengoto(1,1);
  581. }
  582.  
  583.  
  584. /**************
  585.  * SCREENGOTO *
  586.  **************/
  587.  
  588. void screengoto(int x, int y)
  589. {
  590.     union REGS regs;
  591.  
  592.     regs.h.ah = 0x02;
  593.     regs.h.bh = 0;
  594.     regs.h.dh = (unsigned char)y;
  595.     regs.h.dl = (unsigned char)x;
  596.     int86(0x10, ®s, ®s);
  597. }
  598.  
  599. /********
  600.  * BEEP *
  601.  ********/
  602.  
  603. void beep(void)
  604. {
  605.  
  606.     int cont;
  607.  
  608.     outp(0x43,0xB6);
  609.     outp(0x42,0xA9);
  610.     outp(0x42,0x06);
  611.     cont = inp(0x61);
  612.     outp(0x61,cont | 0x03);
  613.     sdelay(4);
  614.     outp(0x61,cont);
  615.  
  616. }
  617.